perm filename ENDRV.OLD[11,HE] blob sn#690542 filedate 1982-12-15 generic text, type T, neo UTF8
; Copyright Xerox Corporation 1979
	.TITLE	ENDRV
	.DSABL	GBL
	.MCALL	IOERR$
	.MCALL	DEVDF$
	.MCALL	HWDDF$
	.MCALL	PKTDF$
	.MCALL	TCBDF$
	.MCALL	INTSV$
	.GLOBL	$FORK
	.GLOBL	$GTPKT
	.GLOBL	$GTWRD
	.GLOBL	$IODON
	.GLOBL	$PTWRD
	.GLOBL	IO.RLB
	IOERR$
	DEVDF$
	HWDDF$
	PKTDF$
	TCBDF$

	.LIST	MEB

LD$EN=0			;REQUIRED FOR LOADABLE DRIVERS

ETHOWC=-4		;ETHERNET OUTPUT WORD COUNT
ETHOBL=-2		;ETHERNET OUTPUT BUFFER LOCATION
ETHOCS=0		;ETHERNET OUTPUT CONTROL & STATUS
ETHOSD=2		;ETHERNET OUTPUT START DELAY
ETHIWC=-4		;ETHERNET INPUT WORD COUNT
ETHIBL=-2		;ETHERNET INPUT BUFFER LOCATION
ETHICS=0		;ETHERNET INPUT CONTROL & STATUS
ETHRDA=2		;ETHERNET READ DEVICE ADDRESS
;
START:				;MUST BE RELOCATABLE 0
TEMP:	.BLKW	1		;SAVED PS
CNTBL:	.BLKW	2		;ADDRESSES OF UCB'S
;
$ENTBL::
	.WORD	ENINI		;INITIATOR ENTRY POINT
	.WORD	ENCAN		;CANCEL I/O ENTRY POINT
	.WORD	ENTIM		;TIMEOUT ENTRY POINT
	.WORD	ENPWF		;POWER FAIL ENTRY POINT
;
;INITIATE I/O
;
ENINI:
	CALL	$GTPKT			;GET AN I/O PACKET TO PROCESS
	BCS	ENPWF
	MOV	R5,CNTBL(R3)		;SAVE UCB POINTER FOR INTERRUPT
	MOV	S.CSR(R4),R2		;GET DEVICE ADDRESS
	CMP	I.FCN(R1),#3000		;GET HOST ADDRESS?
	BEQ	HOST			;YES
	CMP	I.FCN(R1),#IO.RLB	;READ?
	BEQ	IN			;YES
	BR	OUT			;WRITE
;
;GET AND RETURN HOST ADDRESS
;
HOST:
	CLR	ETHICS(R2)		;RESET INPUT BOARD
	CLR	-10(R2)			;RESET OUTPUT BOARD
	MOV	@#172352,R1		;PAR 5
	ASH	#6,R1
	MOV	R1,INADD
	ADD	BUFIN,INADD		;PA OF INBUF
	MOV	R1,OUTADD
	ADD	BUFOUT,OUTADD		;PA OF OUTBUF
	MOV	ETHRDA(R2),R1		;HOST ADDR
	COMB	R1			;I/O STATUS WORD 2
	MOV	#IS.SUC,R0		;I/O STATUS WORD 1
	CLR	R2			;ERROR LOGGING COUNTS
	CALL	$IODON
	BR	ENINI
;
;START INPUT
;
IN:
	MOV	U.CNT(R5),R4		;SET MAX BYTE COUNT
	ASR	R4			;MAKE INTO WORD COUNT
	NEG	R4			;MAKE NEGATIVE
	MOV	R4,ETHIWC(R2)		;SET NEGATIVE WORD COUNT
	MOV	INADD,ETHIBL(R2)	;SET BUFFER ADDRESS
	MOV	#101,ETHICS(R2)		;START INPUT
	BR	ENINI
;
;START OUTPUT
;
OUT:
	MOV	U.CNT(R5),R4		;SET OUTPUT BYTE COUNT
	ASR	R4			;MAKE INTO WORD COUNT
	MOV	R4,R3
	NEG	R4
	MOV	R4,ETHOWC(R2)		;SET NEGATIVE WORD COUNT
	MOV	#OUTBUF,R4
OUT1:
	CALL	$GTWRD			;GET WORD FROM CALLER
	MOV	(SP)+,(R4)+		;PUT IN OUTPUT BUFFER
	SOB	R3,OUT1			;REPEAT UNTIL DONE
	MOV	OUTADD,ETHOBL(R2)	;SET BUFFER ADDRESS
	MOVB	I.PRM+6(R1),ETHOSD(R2)	;SET OUTPUT START DELAY
	MOV	#101,ETHOCS(R2)		;START OUTPUT
	BR	ENINI
;
;CANCEL I/O
;
ENCAN:
	CLR	@S.CSR(R4)		;RESET ETHERNET BOARD
	MOV	#IE.ABO,R0		;SET ABORT CODE
	CLR	R1			;BYTE CNT = 0
	CLR	R2
	CALL	$IODON			;I/O COMPLETED
	RETURN
;
;TIMEOUT ENTRY
;
ENTIM:
	RETURN
;
;POWER-FAIL ENTRY
;
ENPWF:
	RETURN
	.PAGE
;
;INPUT/OUTPUT COMPLETE INTERRUPT
;
$ENINT::
	JMP	@TABLE(R4)		;EXECUTE CORRECT ROUTINE
TABLE:					;INTERRUPT VECTORS
	.WORD	$ENOUT			;OUTPUT
	.WORD	$ENINP			;INPUT
        .WORD   $ENOUT			;COLLISION
;
;INPUT INTERRUPT
;
$ENINP::
	INTSV$	EN,PR5,2		;R5 = UCB ADDRESS
	MOV	U.SCB(R5),R4		;R4 = SCB ADDRESS
	MOV	@S.CSR(R4),U.CW3(R5)	;INPUT CONTROL & STATUS
	CALL	$FORK
	MOV	U.SCB(R5),R4		;R4 = SCB ADDRESS
	MOV	S.CSR(R4),R2
	CLR	ETHICS(R2)		;RESET INPUT BOARD
	TST	U.CW3(R5)
	BPL	ENINP1
	MOV	#IE.VER,R0		;UNSUCCESSFUL COMPLETION
	CLR	R1			;INPUT BYTE COUNT
	BR	ENINP2
ENINP1:
	MOV	#IS.SUC,R0		;SUCCESSFUL COMPLETION
	MOV	ETHIWC(R2),R1		;INPUT WORD COUNT (NEG)
	BIS	#176000,R1		;SIGN EXTEND
	ASL	R1			;CONVERT TO BYTES
	ADD	U.CNT(R5),R1		;R1 = PACKET LENGTH (BYTES)
	MOV	R1,R3
	ASR	R3			;R3 = PACKET LENGTH (WORDS)
	MOV	#INBUF,R4
INLOOP:
	MOV	(R4)+,-(SP)
	CALL	$PTWRD			;PASS WORD TO CALLER
	SOB	R3,INLOOP		;REPEAT UNTIL DONE
ENINP2:
	CLR	R2			;ERROR LOGGING COUNTS
	CALL	$IODON
	JMP	ENINI
;
;OUTPUT INTERRUPT
;
$ENOUT::
	INTSV$	EN,PR5,2		;R5 = UCB ADDRESS
	MOV	U.SCB(R5),R4		;R4 = SCB ADDRESS
	MOV	@S.CSR(R4),U.CW3(R5)	;OUTPUT CONTROL & STATUS
	CALL	$FORK
	MOV	U.SCB(R5),R4		;R4 = SCB ADDRESS
	MOV	S.CSR(R4),R2
	CLR	ETHOCS(R2)		;RESET OUTPUT BOARD
	TST	U.CW3(R5)
	BPL	ENOUT1
	MOV	#IE.VER,R0		;UNSUCCESSFUL COMPLETION
	CLR	R1			;OUTPUT BYTE COUNT
	BR	ENOUT2
ENOUT1:
	MOV	#IS.SUC,R0		;SUCCESSFUL COMPLETION
	MOV	U.CNT(R5),R1		;OUTPUT BYTE COUNT
ENOUT2:
	CLR	R2			;ERROR LOGGING COUNTS
	CALL	$IODON
	JMP	ENINI
;
;I/O BUFFERS
;
BUFIN:	.WORD	INBUF-START		;OFFSET IN PARTITION
INADD:	.BLKW	1			;PA OF INBUF
INBUF:	.BLKW	279.
;
BUFOUT:	.WORD	OUTBUF-START		;OFFSET IN PARTITION
OUTADD:	.BLKW	1			;PA OF OUTBUF
OUTBUF:	.BLKW	279.
	.END